package com.fuyun.rpc.common.utils;

import java.util.Map;
import java.util.function.BiFunction;

/**
 * @author: zrq1351
 * @date: 2025/2/15
 */
public class MapMergeUtils {

	/**
	 * 合并源Map到目标Map，自定义冲突解决逻辑
	 *
	 * @param target   目标Map（合并后修改此Map）
	 * @param source   源Map（从此Map读取数据）
	 * @param resolver 冲突解决函数：当键冲突时，通过此函数决定最终值
	 */
	public static <K, V> void merge(Map<K, V> target, Map<? extends K, ? extends V> source,
		BiFunction<? super V, ? super V, ? extends V> resolver) {

		for (Map.Entry<? extends K, ? extends V> entry : source.entrySet()) {
			K key = entry.getKey();
			V sourceValue = entry.getValue();

			// 如果目标Map已存在该键，调用 resolver 处理冲突
			if (target.containsKey(key)) {
				V targetValue = target.get(key);
				V resolvedValue = resolver.apply(targetValue, sourceValue);
				target.put(key, resolvedValue);
			} else {
				// 不存在冲突，直接添加
				target.put(key, sourceValue);
			}
		}
	}
}